package com.esreport.service;

import com.alibaba.fastjson.JSONObject;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface ReportService {

    long countHits(Integer siteId);

    /**
     * 点击量
     *
     * @param start
     * @param end
     * @param siteId
     * @return
     */
    long countHits(Date start, Date end, Integer siteId);

    /**
     * 点击量去重
     * @param start
     * @param end
     * @param siteId
     * @return
     */
    long countHitsDistinct(Date start, Date end, Integer siteId);

    /**
     * 点击量去重
     * @param siteId
     * @return
     */
    long countHitsDistinct(Integer siteId);

    /**
     * 点击量ip去重
     * @param start
     * @param end
     * @param siteId
     * @return
     */
    long countHitsDistinctIP(Date start, Date end, Integer siteId);

    /**
     * 点击量ip去重
     * @param siteId
     * @return
     */
    long countHitsDistinctIP(Integer siteId);


    /**
     * 新用户
     *
     * @param start
     * @param end
     * @param siteId
     * @return
     */
    long countNewUser(Date start, Date end, Integer siteId);

    /**
     * 统计浏览量（新闻）
     *
     * @param start
     * @param end
     * @param siteId
     * @return
     */
    long countBrowse(Date start, Date end, Integer siteId);

    /**
     * 停留时常求和
     *
     * @param start
     * @param end
     * @param siteId
     * @return 毫秒
     */
    long sumStayTime(Date start, Date end, Integer siteId);

    /**
     * 停留时长求和
     * @param siteId
     * @return
     */
    long sumStayTime(Integer siteId);

    /**
     * 分享次数统计
     *
     * @param start
     * @param end
     * @param siteId
     * @return
     */
    long countShare(Date start, Date end, Integer siteId);

    /**
     * 首次启动数
     *
     * @param siteId
     * @return
     */
    long countFirstStart(Date start, Date end, Integer siteId);

    /**
     * 去重统计阅读新闻用户数
     *
     * @param siteId
     * @param start
     * @param end
     * @return
     */
    long distinctCountBrowseNewsUser(Date start, Date end, Integer siteId);

    /**
     * @Author fanxingwei
     * @Description 按小时分组统计启动数
     * @Date 2019/10/31 16:30
     * @Param [start, end, siteId]
     * @return java.util.List<com.esreport.vo.StartUpCountVo>
     */
    List<Long> groupStartUpCount(Date start,Date end,Integer siteId);

    /**
     * @Author fanxingwei
     * @Description 去重统计用户（用来统计下载数）
     * @Date 2019/11/6 15:12
     * @Param [siteId]
     * @return long
     */
    long distinctCountFirstStart(Integer siteId);

    /**
     * @Author fanxingwei
     * @Description 去重统计第一次启动 （环翠用） * @Date 16:58 2020/1/14
     * @Param [siteId]
     * @return long
     **/
    long distinctCountFirstStartForHuanCui(Integer siteId);

    /**
     * @Author fanxingwei
     * @Description 累计启动数
     * @Date 2019/11/6 15:51
     * @Param [siteId] 站点ID
     * @return long
     */
    long countStartUp(Integer siteId);

    /**
     * @Author fanxingwei
     * @Description 今日启动数
     * @Date 2019/11/8 11:07
     * @Param [siteId]
     * @return long
     */
    long countStartUpForToday(Integer siteId);

    /**
     * @Author fanxingwei
     * @Description 分组统计操作总数
     * @Date 2019/11/12 10:25
     * @Param [siteId, start, end]
     * @return long
     */
    long countSeriesSign(Integer siteId,Date start,Date end);

    /**
     * @Author fanxingwei
     * @Description 按天分组统计新增用户数
     * @Date 2019/11/12 16:37
     * @Param [start, end, siteId]
     * @return java.util.List<java.lang.Long>
     */
    List<Long> groupNewUserCount(Date start,Date end,Integer siteId);

    /**
     * @Author fanxingwei
     * @Description 按截止时间和类型查新手机机型总量（安卓，IOS）
     * @Date 2019/11/15 17:42
     * @Param [start, end, siteId] end：截止时间
     * @return java.util.List<java.lang.Long>
     */
    Long getPhoneTypeCount(Date end,Integer siteId,String phoneType);

    /**
     * @Author fanxingwei
     * @Description 查询留存人数
     * @Date 2019/11/19 11:05
     * @Param [date, siteId, userList]
     * @return java.lang.Long
     */
    Long getInUserMemberCount(Date start,Date end,Integer siteId,String[] deviceIdList);

    /**
     * @Author fanxingwei
     * @Description 时间段内获取首次启动的用户名数组
     * @Date 2019/11/19 18:13
     * @Param [start, end, siteId]
     * @return java.util.List<java.lang.String>
     */
    String[] getFirstStartUserList(Date start,Date end,Integer siteId);

    /**
     * @Author fanxingwei
     * @Description 按动作统计时间段内的总数
     * @Date 2019/11/26 15:28
     * @Param [start, end, siteId, Action]
     * @return java.lang.Long
     */
    Long getActionCount(Date start,Date end,Integer siteId,String action);

    /**
     * @Author fanxingwei
     * @Description 按日分组统计action的点击量
     * @Date 2019/11/26 16:16
     * @Param [start, end, siteId, action]
     * @return java.util.List<java.lang.Long>
     */
    Map<String,Long> groupDayForActionByAction(Date start, Date end, Integer siteId, String action);

    /**
     *
     * @Description 按时分组统计action的点击量
     * @Date 2019/11/26 16:16
     * @Param [start, end, siteId, action]
     * @return java.util.List<java.lang.Long>
     */
    Map<String,Long> groupHourForActionByAction(Date start, Date end, Integer siteId, String action);

    /**
     * 去重统计日期内的启动数
     * @param start
     * @param end
     * @param siteId
     * @return
     */
    Long countStartUp(Date start, Date end, Integer siteId);

    /**
     * 去重统计 开始时间结束时间
     * @param startTime
     * @param endTime
     * @param siteId
     * @return
     */
    Long countFirstStartUp(String startTime,String endTime,Integer siteId);

    /**
     * 去重启动数
     * @param siteId
     * @return
     */
    Long distinctCountStartUp(Integer siteId);

    /**
     * 不去重安装数
     * @param siteId
     * @return
     */
    Long countFitstStart(Integer siteId);

    /**
     * 去重统设备数
     * @param siteId
     * @return
     */
    Long countNum(Integer siteId);

    /**
     * 去重设备数（时间范围）
     * @param siteId
     * @param start
     * @param end
     * @return
     */
    Long countNum(Integer siteId,Date start,Date end);

    /**
     * 时间段内查询action 并按设备号去重
     * @param siteId
     * @param start
     * @param end
     * @param action
     * @return
     */
    Long countFirstStartBetweenDateNum(Integer siteId,String start,String end,String action);

    /**
     * 按天分组统计action
     * @param siteId
     * @param start
     * @param end
     * @param action
     * @return
     */
    List<JSONObject> countFirstStartGroupByDay(Integer siteId, String start, String end, String action);


    /**
     * 按行为和站点统计次数
     * @param siteId 站点Id
     * @param action 行为
     * @return
     */
    Long countByAction(Integer siteId, String action);

    /**
     * 按月份分组统计党史学习次数
     * @param siteId
     * @param start
     * @param end
     * @return
     */
    List<JSONObject> groupCountDangShiStudyByDay(Integer siteId, String start, String end);

    /**
     * 按日分组统计个人每日党史学习次数
     * @param username
     * @param start
     * @param end
     * @param action
     * @return
     */
    List<JSONObject> groupDangShiStudyByUsername(String username, String start, String end, String action);

    /**
     *  根据username和action统计次数
     * @param username
     * @param action
     * @return
     */
    Long countByAction(String username, String action);



    /**
     * 统计商店的总浏览数或转发数
     * @param action  用户行为
     * @param shopId  店铺id
     * @return 浏览或转发数
     */
    Long countByActionAndShop(String action,Integer shopId);

    /**
     * 统计商店某时间段总的浏览数或转发数
     * @param action 用户行为
     * @param shopId 店铺id
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @return  浏览或转发数
     */
    Long countByActionAndShop(String action,Integer shopId,Date beginTime,Date endTime);

    /**
     * 统计广告的浏览或点击次数
     * @param action 用户行为
     * @param advertisePutId 广告投放id
     * @return 广告的浏览或点击次数
     */
    Long countByActionAndAd(String action,Integer advertisePutId);

    /**
     * 统计广告某时段的浏览或点击次数
     * @param action 用户行为
     * @param advertisePutId 广告投放id
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    Long countByActionAndAd(String action,Integer advertisePutId,Date beginTime,Date endTime);

    /**
     *
     * 按日分组统计广告投放
     *
     * @param start 开始时间
     * @param end 结束时间
     * @param  advertisePutId  广告投放id
     * @return  每日的量
     */
    List<Map<String,Object>> getAdDayHistogram(Date start, Date end, Integer advertisePutId);
}
